package com.zyf.project.binaryproto.specification;

import com.zyf.project.binaryproto.annotation.DataField;

import java.util.List;

/**
 * <h1>数据契约格式标准</h1>
 * <p>这个接口提供了数据契约的格式描述</p>
 *
 * @author Zhou Yifan
 */
public interface DataSpecification {

    /**
     * 数据契约的类型编码
     *
     * @return int 值
     */
    int getCode();

    /**
     * <p>数据契约的版本</p>
     * <p>由类型编码 {@link #getCode()} 和字段列表 {@link #getFields()} 进行哈希生成的 64 位整数</p>
     *
     * @return long 值
     */
    long getVersion();

    /**
     * 名字
     *
     * @return 字符串
     */
    String getName();

    /**
     * 描述
     *
     * @return 字符串
     */
    String getDescription();

    /**
     * <p>按定义顺序排列的字段格式标准的列表</p>
     * <p>字段顺序由 {@link DataField#order()} 定义</p>
     *
     * @return {@link FieldSpecification} 的 {@link List}
     */
    List<FieldSpecification> getFields();

    /**
     * 按顺序定义的二进制数据片段的格式标准的列表
     *
     * @return {@link BinarySliceSpecification} 的 {@link List}
     */
    List<BinarySliceSpecification> getSlices();
}
